<?php

/**
 * Store_ImagesController
 * 
 * Модуль магазина, контроллер фотографий для товаров
 * 
 * @package   Store
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 */
 
class Store_ImagesController extends Lord_Controller_Action 
{    
	
/*------------------------------------------------------------------------------*/

	/**
	 * Индексный метод.
	 * Отображает картинки для товара
	 */
	 
	public function indexAction()
	{
		// получаем айдишник категории
		$id = $this->_checkId();
				
		// получаем нужные данные
		$good   = $this->model->getGood($id);
		$images = $this->model->getGoodImages($id);
		
		// и отправляем их в шаблон
		$this->view->good   = $good;
		$this->view->images = $images;
		
		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Добавление 
	*/
	
	public function addAction()
	{
		return $this->_process('add');
	}


/*------------------------------------------------------------------------------*/

	/**
	* Редактирование картинки
	*/
	
	public function editAction()
	{
		// достаем нужные данные
		$data = $this->model->getImage($this->_checkId())->toArray();
		
		// если в $data пусто - нам пытаются скормить что-то не то
		if(empty($data))
			return $this->view->err = 'store_images_edit_fail';
			
		// и отдаем на редактирование
		return $this->_process('edit', $data);
	}


/*------------------------------------------------------------------------------*/
 
	/**
	* Удаление 
	*/
	
	function deleteAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();
		
		// достаем дату
		$image = $this->model->getImage($id);
		
		// отправляем данные в шаблон
		$this->view->image = $image;
		
		if ($this->_request->isPost()) 
		{           
			// если юзер подтвердил - удаляем
			if ($this->_request->getPost('conf') == 'ok') 
			{
				// удаляем из базы
				$this->model->delImage($id);
				// удаляем файлы
				unlink('content/store/goods/min/'  . $image->file);
				unlink('content/store/goods/mid/'  . $image->file);
				unlink('content/store/goods/max/'  . $image->file);
			}
		} 
		else 
		{
			// если в $image пусто - нам пытаются скормить левый $id
			if(empty($image))
				return $this->view->err = 'store_images_delete_fail';
			else
				return;
		}
		
		// возвращаемся на главную страницу
		$this->_redirect('store/images/index/id/'.$image->gid);
	}
	
/*==============================================================================*/

	/**
	* Приватный метод для проверки айдишника записи
	*/
	
	private function _checkId()
	{
		$id = $this->_getParam('id');
		 
		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return 0;
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для обработки 
	* добавления и редактирования 
	* 
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->form = $form; 
		// зачитываем конфиг				
		$config = $this->_helper->config();
		
		// валидация
		if (!empty($_POST)) 
		{
			if (!$form->isValid($_POST)) 
			{   
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму         
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors(); 
				// показываем форму с невалидными данными
				return $this->view->form = $this->_form($values, $errors, $action);
			}
		}
		
		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost()) 
		{    
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();
			// префикс для обеспечения уникальности имени
            $prefix = rand(0, 999999);     
			// добавление 
			if($action == 'add')
			{                               
				// данные для добавления
				$data['name']   = $values['name'];
				$data['file']   = $values['image'];
				$data['gid']    = $values['id'];
				$data['main']   = $values['main'];
				
				// если эту фотку выбрали главной
				if($values['main'] == 1)
				{
					// все остальные пометки о главности затираем нулями
					$upd['main'] = 0;
					$this->model->updateImage($upd, $values['id']);
				}
				
				// приводим картинку к общему размеру
				$this->_helper->imageResize( 'content/store/goods/max/' . $data['file'], 
								   'content/store/goods/mid/'  . $prefix . $data['file'],
								   $config->image->midW, $config->image->midH);
				// нарезаем тумбочку
				$this->_helper->imageResize( 'content/store/goods/max/' . $data['file'], 
								   'content/store/goods/min/'  . $prefix . $data['file'],
								   $config->image->minW, $config->image->minH);
                // проверка: загрузился ли файл
                if(    !is_file('content/store/goods/max/' . $data['file'])
                    or !is_file('content/store/goods/mid/'  . $prefix . $data['file'])
                    or !is_file('content/store/goods/min/'  . $prefix . $data['file']))
                {
                    return $this->view->err = 'store_images_process_upload_fail';
                }

				// добавляем в базу данных
                $data['file'] = $prefix . $data['file'];
				$this->model->addImage($data);
				
				// сообщение  
				$this->view->msg = 'store_images_process_add_ok';              
			}
			elseif($action == 'edit')
			{
				// выбираем нужные данные для редактирования
				$data['name']   = $values['name'];
				$data['main']   = $values['main'];
				        
				// если эту фотку выбрали главной                
				if($values['main'] == 1)
				{
					// все остальные пометки о главности затираем нулями
					$this->model->clearMainImage($data['gid']);
				}
				
				// обновляем базу	 
				$this->model->updateImage($data, $data['id']);
				// return $this->view->msg = 'store_images_process_edit_ok';
				
			}
			return $this->_redirect('store/images/index/id/' . $data['gid']);
		}        
	}
	
/*------------------------------------------------------------------------------*/
	
	/**
	* Приватный метод для построения формы
	* В качестве аргумента принимает уже заполненые 
	* данные (при редактировании)
	* 
	* @param $data array 
	* @param $errors array
	* @param $action string
	* @param $categories array
	* @return object
	*/
	
	private function _form( $data = array(), 
							$errors = array(), 
							$action = 'add' )
	{
 
		// обратите внимание, форма создается на основе собственного класса. 
		$form = new Lord_Form_Form();
		$form->setAction(  '/' . $this->_moduleName
						 . '/' . $this->_controllerName
						 . '/' . $action )
			 ->setMethod('post');
			 
		// кодировка	 
		$charset = $this->_helper->config()->common->charset;
			 
		if($action == 'add')
		{
			// Сама фотография
			$image = new Zend_Form_Element_File('image');
			$image->setLabel($this->view->translate('store_images_form_image'))
				   ->setDescription($this->view->translate('store_images_form_image_desc'))
				   ->setDestination('content/store/goods/max')
				   // ограничимся загрузкой одного файла
				   ->addValidator('Count', false, 1)
				   // поставим лимит в 100K
				   ->addValidator('Size', false, 102400)
				   // принимать будем только JPEG, PNG, and GIFs
				   ->addValidator('Extension', false, 'jpg,png,gif')
				   ->setRequired(true)
				   ;
			$form->addElement($image);
		}
		
		// Заголовок картинки
		$this->view->good = $good = $this->model->getGood($this->_checkId());
		$name = new Lord_Form_Element_Text('name', array(
			'label'       => $this->view->translate('store_images_form_name'),
			'description' => $this->view->translate('store_images_form_name_desc'),
			'maxlength'   => '50',
			'validators'  => array(
				array('Alnum',        true, array(true)),
				array('StringLength', true, array(0, 50, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : $good->name
		));
		$form->addElement($name);
		
		// Будет ли эта фотка основной  
		$main = new Zend_Form_Element_Radio('main', array(
			'label'       => $this->view->translate('store_images_form_main'),
			'description' => $this->view->translate('store_images_form_main_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_images_form_main_yes'),  
								   '0'=>  $this->view->translate('store_images_form_main_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['main'])) ? $data['main'] : '',
			'required'    => true, 
		)); 
		$main->setSeparator(' '); 
		$form->addElement($main);
		
		// айдишник
		$id = $form->createElement('hidden', 'id')
			->setValue($this->_checkId());
		$form->addElement($id);
		
		// кнопочка сабмита
		$form->addElement('submit', 'save', array('label' => $this->view->translate('store_images_form_submit')));
			
		// ошибки
		$this->_helper->FormErrors($errors, $form);
		
		return $form;
	}
	
/*------------------------------------------------------------------------------*/
}
